const p1 = {
  lastName: '张',
  firstName: '三',
  get fullName() {
    return this.lastName + this.firstName
  }
}

const p2 = {
  lastName: '李',
  firstName: '四',
  get fullName() {
    return this.lastName + this.firstName
  }
}

console.log(p1.fullName); // 张三
console.log(Reflect.get(p1, 'fullName')); // 张三
console.log(Reflect.get(p1, 'fullName', p2)); // 李四

// -----------------------------------------------------------------------------

const proxy = new Proxy(p1, {
  get(target, key, receiver) {
    console.log('get', key);
    // return target[key];
    return Reflect.get(target, key, receiver);
  }
})

console.log(proxy.fullName); // 张三
// return target[key] 的前提下，思考：getter 行为应该被触发几次？  3次
// 当我们期望监听代理对象的 getter 和 setter 时，不应该使用 target[key]，因为它在某些时候（比如 fullName）下是不可靠的。
// 而应该使用 Reflect，借助它的 get 和 set 方法，使用 receiver 作为 this 上下文，已达到期望的结果（触发3次getter）